文件上传入门案例+校验

FileServiceImpl
@Service
public class FileServiceImpl implements FileService {
/**
 * 业务: 文件上传入门案例
 * URL:  http://localhost:8091/file/upload
 * 参数:  file=[101001010111]
 * 返回值: SysResult对象(ImageVO)
 * 知识回顾: 字节流/字符流/缓存流  默认的语法复杂
 * 高级API:  SpringMVC 专门针对与流,开发了一个高级API
 * 文件上传步骤:
 *      1.获取文件上传名称
 *      2.准备文件上传的目录
 *      3.准备全文件的路径   目录/文件名称
 *      4.实现上传
 */  /**
 * 业务: 文件上传入门案例
 * URL:  http://localhost:8091/file/upload
 * 参数:  file=[101001010111]
 * 返回值: SysResult对象(ImageVO)
 * 知识回顾: 字节流/字符流/缓存流  默认的语法复杂
 * 高级API:  SpringMVC 专门针对与流,开发了一个高级API
 * 文件上传步骤:
 *      1.获取文件上传名称
 *      2.准备文件上传的目录
 *      3.准备全文件的路径   目录/文件名称
 *      4.实现上传
 */


@RestController
@CrossOrigin
@RequestMapping("/file")
public class FileController {

    @Autowired
    private FileService fileService;

    /**
     * 需求分析: 文件上传完成之后,需要返回ImageVO对象
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public SysResult upload(MultipartFile file) throws IOException {

        ImageVO imageVO = fileService.upload(file);
        //不成功 应该返回null
        if(imageVO == null){
            return SysResult.fail();
        }
        return SysResult.success(imageVO);
    }

---------------------------------------------------------------------------------
   /* @PostMapping("/upload")
    public SysResult upload(MultipartFile file) throws IOException {
        //1.动态获取文件名称
        String fileName = file.getOriginalFilename();
        //2.准备文件目录  Linux系统不能识别\
        String dirPath = "F:/images";
        File dirFile = new File(dirPath);
        if(!dirFile.exists()){
            //应该创建一个新目录 创建多级目录
            dirFile.mkdirs();
        }
        //3.拼接文件路径
        String filePath = "F:/images/" + fileName;
        //4.实现文件上传
        file.transferTo(new File(filePath));
        System.out.println("实现文件上传");
        return SysResult.success();
    }*/

    ---------------------------------------------------------------------------------
FileServiceImpl
      * 1.校验文件上传的类型   jpg|png|gif
      * 2.应该校验文件是否为恶意程序.   木马.exe.jpg
      * 3.为了提高检索效率  应该分目录存储.  1.hash方式  xx/xx/xx/xx 分布不均
      * 2.日期格式   yyyy/MM/dd  目录不断增长
      * 4.防止文件重名        UUID.jpg
      *
      * @param file
      * @return
      */
     @Override
     public ImageVO upload(MultipartFile file) {
         //1.图片类型的校验  正则表达式  aaa.jpg
         String fileName = file.getOriginalFilename();
         //字符大小写 干扰正则的判断  将所有的文件转化为小写字母
         fileName = fileName.toLowerCase();
         //程序不满足正则, 则用户上传的图片有问题
         if (!fileName.matches("^.+\\.(jpg|png|gif)$")) {

             return null;
         }

         //2. 校验文件是否为恶意程序  判断依据 属性宽度和高度  aa.exe.jpg
         //进try {}catch
         try {
             //该对象是用来专门操作图片的API
             BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
             //设置宽和高的设置比例
             int height = bufferedImage.getHeight();
             int width = bufferedImage.getWidth();

             if (height == 0 || width == 0) {
                 //如果有一项为0 则表示一定不是正经的图片
                 return null;
             }
             System.out.println("如果程序执行到这一行说明一切正常!!!");

             //3.分目录存储文件 /yyy/mm/dd
             //3.1准备文件目录
             String localDir = "D:/images";
             String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                     .format(new Date());
             //拼接文件目录  F:/images/2021/MM/dd/
             String dirPath = localDir + dateDir;
             File dirFire = new File(dirPath);
             //3.2判断是否判断创建目录
             if (!dirFire.exists()) {
                 //在不存在目录时候创建目录
                 dirFire.mkdirs();
             }

             //4.防止文件重名UUID后缀
             String uuid = UUID.randomUUID().toString().replace("-", "");
             //获取.（.）所有下标位置
             int index = fileName.lastIndexOf(".");
             //截取文件类型
             String fileType = fileName.substring(index);
             //拼接新文件路径
             String realFileName = uuid + fileType;

         } catch (IOException e) {
             e.printStackTrace();
             return null;
             //如果程序执行报错,则返回null
         }
         return null;
     }
 }
